#include <algorithm>
#include <cctype>
#include <iostream>
#include <regex>
using namespace std;
int main() {
    string str = "get /bitejiuyeke/login?user=zhangsan&passward=123 HTTP/1.1\r\n";
    smatch matches;
    regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?", regex::icase);
    // 这里的括号就是要获取的字符串，没有括号的就是要过滤的（除了?:....）
    // 第一个匹配使用的|表示的是或者
    // ^表示非，*表示的是0次或是多次
    // \\?表示的是转义，因为这里的?有特殊用途
    // [01]表示的是后边有0/1个字符串
    // ?:表示的是匹配不提取，后面加上了一个?表示的是前面的表达式有0或是1次
    bool ret = regex_match(str, matches, e);
    if(ret == false) {
        return -1;
    }
    string method = matches[1];
    transform(method.begin(), method.end(), method.begin(), ::toupper);
    cout << method << endl;
    for(int i = 0; i < matches.size(); i++) {
        cout << i << " : ";
        cout << matches[i] << endl;
    }
    return 0;
}